package com.itjob.scott.lesson02;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.itjob.scott.entity.StudentEntity;


/**
 * 
 *@author huanghoulin in ITJob  987366988@qq.com
 *@date   2016年4月21日 上午11:08:15
 *@version V1.0
 */
public class JDBCUtil {
	public static void query(String name) throws ClassNotFoundException{
		//1 加载数据库驱动
		Class.forName("oracle.jdbc.driver.OracleDriver");
		
		//xe表示数据库的名字 后面是用户名和密码 XE数据库只能有1个数据库就叫xe 而且不能修改名字
		Connection connection=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		List<StudentEntity> studentList=new ArrayList<StudentEntity>();
		try {
			//2获取数据库连接
			connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","scott","scott");
			
			//3创建PreparedStatement 把参数预处理     把参数和sql整合成最终的语句
			ps = connection.prepareStatement("select * from itjob_student_t where name=?");
			
			//4给问号设值
			ps.setString(1, name);
			
			//5执行SQL语句 CRUD 查询语句用executeQuery(),非查询语句用executeUpdate() 预处理
			rs= ps.executeQuery();//查询语句一定不能带分号
			
			//6 处理查询结果 循环结果集  用流的方式来获取 
			while(rs.next()){
				//首先看你是否有下1条记录  列的下标从0开始
				StudentEntity entity = new StudentEntity();
				entity.setId(rs.getInt(1));
				entity.setName(rs.getString("NAME"));
				studentList.add(entity);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			//7 关闭资源  数据库的超时时间为30分钟  取到东西后要释放资源  先开后关  后开的先关
			try {
				if(rs!=null){
					rs.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(ps!=null){
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(connection != null){
					connection.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		for (StudentEntity s : studentList) {
			System.out.println(s);
		}
	}
	
	
	//"insert into itjob_student_t values((select max(id)+1 from itjob_student_t),'张无忌')"
	public static void insert(String name) throws ClassNotFoundException{
		//1 加载数据库驱动
		Class.forName("oracle.jdbc.driver.OracleDriver");
		
		//xe表示数据库的名字 后面是用户名和密码 XE数据库只能有1个数据库就叫xe 而且不能修改名字
		Connection connection=null;
		PreparedStatement ps=null;
		try {
			//2获取数据库连接
			connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","scott","scott");
			
			//3创建PreparedStatement 把参数预处理     把参数和sql整合成最终的语句
			ps = connection.prepareStatement("insert into itjob_student_t values((select max(id)+1 from itjob_student_t),?)");
			
			//4给问号设值
			ps.setString(1, name);
			
			//5执行SQL语句 CRUD 查询语句用executeQuery(),非查询语句用executeUpdate() 预处理
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			//7 关闭资源  数据库的超时时间为30分钟  取到东西后要释放资源  先开后关  后开的先关
			try {
				if(ps!=null){
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(connection != null){
					connection.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		System.out.println("插入成功....");
	}
	
	//update itjob_student_t set name='赵敏' where id=2
	public static void update(String name, int id) throws ClassNotFoundException{
		//1 加载数据库驱动
		Class.forName("oracle.jdbc.driver.OracleDriver");
		
		//xe表示数据库的名字 后面是用户名和密码 XE数据库只能有1个数据库就叫xe 而且不能修改名字
		Connection connection=null;
		PreparedStatement ps=null;
		try {
			//2获取数据库连接
			connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","scott","scott");
			
			//3创建PreparedStatement 把参数预处理     把参数和sql整合成最终的语句
			ps = connection.prepareStatement("update itjob_student_t set name=? where id=?");
			
			//4给问号设值
			ps.setString(1, name);
			ps.setInt(2, id);
			
			//5执行SQL语句 CRUD 查询语句用executeQuery(),非查询语句用executeUpdate() 预处理
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			//7 关闭资源  数据库的超时时间为30分钟  取到东西后要释放资源  先开后关  后开的先关
			try {
				if(ps!=null){
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(connection != null){
					connection.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		System.out.println("修改成功....");
	}
	
	public static void delete(int id) throws ClassNotFoundException{
		//1 加载数据库驱动
		Class.forName("oracle.jdbc.driver.OracleDriver");
		
		//xe表示数据库的名字 后面是用户名和密码 XE数据库只能有1个数据库就叫xe 而且不能修改名字
		Connection connection=null;
		PreparedStatement ps=null;
		try {
			//2获取数据库连接
			connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","scott","scott");
			
			//3创建PreparedStatement 把参数预处理     把参数和sql整合成最终的语句
			ps = connection.prepareStatement("delete from itjob_student_t where id =?");
			
			//4给问号设值
			ps.setInt(1, id);
			
			//5执行SQL语句 CRUD 查询语句用executeQuery(),非查询语句用executeUpdate() 预处理
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			//7 关闭资源  数据库的超时时间为30分钟  取到东西后要释放资源  先开后关  后开的先关
			try {
				if(ps!=null){
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(connection != null){
					connection.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		System.out.println("删除id="+id+"成功....");
	}

}
